import java.io.FileNotFoundException;

public class Test01 {
    //加上 throws FileNotFoundException 这个声明后就是显示地告诉我们这个代码可能会出现异常
    private static void openConfig(String filename) throws FileNotFoundException {
        if(!filename.equals("config.text")){
            //throw 让代码能够爆出一个异常
            throw new FileNotFoundException("文件不存在");
        }
    }

    private static void getElem(int[] arr,int index){
        if (arr == null){
            //数组为空抛出空指针异常
            throw new NullPointerException("数字为空");
        }
        if (index > 0 || index >= arr.length)
            throw new ArrayIndexOutOfBoundsException("数组越界引用");
    }
    public static void main(String[] args) throws FileNotFoundException{
        //程序运行过程中产生的一种运行错误
        //编译错误和异常是不一样的 ，编译错误是编译错误 ， 异常是运行过程中出现的情况

//        System.out.println(10/0);

        /*
        1.整个 Java 标准库提供了很多常见的异常
        2.整个一场体系中分为两大类 ， Error （JVM用） Exception （程序员用）

        throw 让代码能够抛出一个异常
        throws 只是声明可能会抛出的一些异常

        受查异常编译器会进行严格的检查 ， 也可以称为编译器异常
         */
//        openConfig("xxx");

        int[] arr = {1,2,3};
        getElem(arr,0);

        /*注意事项
            1. throw 必须写在方法内部
            2.抛出的对象必须是 Exception或者 Exception 的子类
            3.如果抛出的是 RunTimeException 或者RunTinmeExcepption 的子类 ， 则可以不用处理 ， 直接交给 JVM 来处理
            4.如果抛出的是编译时异常 ， 用户处理， 否则无法通过编译 （异常一旦抛出后续代码就不会再执行了）

         */

        /*
            1.throws 必须跟在方法的参数列表之后
            2.声明的异常不许是 Exception 或 Exception 的子类
            3.方法内部如果抛出多个异常 ， throws 之后必须跟多个异常类型 ， 之前用逗号隔开 ， 如果抛出的多个异常类型具有父子关系 ， 直接声明父类即可
         */

    }
}
